package generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

class Generator {
    public static void main(String[] args) {
        // 创建generator对象
        AutoGenerator autoGenerator = new AutoGenerator();//我们需要操作该对象进行快速创建

        // 1. 数据源
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/xinguan?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");//驱动名称
        dataSourceConfig.setUsername("root");//用户名
        dataSourceConfig.setPassword("root");//密码
        dataSourceConfig.setDbType(DbType.MYSQL);//数据库类型 DbType是个枚举类型，具体类型参考MyBatisPlus源码
        autoGenerator.setDataSource(dataSourceConfig);


        // 2. 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/base-web/src/main/java");//生成的代码存放位置 当前路径的src下的main下的java里 如果是多个工程可以自行去拼一下路径
        globalConfig.setOpen(false);//表示创建完成是否需要打开文件夹
        globalConfig.setAuthor("Egg");//代码的作者
        globalConfig.setSwagger2(true);//开启 Swagger 注解
        globalConfig.setIdType(IdType.ASSIGN_UUID);// 主键策略配置
        globalConfig.setDateType(DateType.ONLY_DATE);
        globalConfig.setServiceName("%sService");//这是声明我们Service层文件夹的名字的 不加这个配置会让生成的该层文件夹名字开头存在一个I,此处用通配符方式去掉
        autoGenerator.setGlobalConfig(globalConfig);


        //包信息
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.egg.system");//父包
        packageConfig.setController("controller");//以下是各层包名
        packageConfig.setService("service");
        packageConfig.setServiceImpl("service.impl");
        packageConfig.setMapper("mapper");
        packageConfig.setEntity("pojo");
        autoGenerator.setPackageInfo(packageConfig);

        //配置策略
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tb_user","tb_log","tb_department","tb_role");//查询的表名 多表可以在中间加上逗号分隔开
        strategyConfig.setEntityLombokModel(true);//此处需要引入Lombok
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);//表明和实体类名转换 这里是下划线转驼峰
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);//列名与字段 下划线转驼峰
        strategyConfig.setRestControllerStyle(true);//设置controller的api风格  使用RestController
        strategyConfig.setControllerMappingHyphenStyle(true);//驼峰转连字符
        strategyConfig.setTablePrefix("tb_");

        // 自动填充配置
        TableFill gmtCreat = new TableFill("create_time", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        TableFill deleted = new TableFill("deleted", FieldFill.INSERT);
        //以下作用是添加create_time 和 update_time 的注解，和对应的策略
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreat);
        tableFills.add(gmtModified);
        tableFills.add(deleted);
        strategyConfig.setTableFillList(tableFills);
        strategyConfig.setVersionFieldName("version");    // 乐观锁
        strategyConfig.setLogicDeleteFieldName("deleted");
        //插入点1
        autoGenerator.setStrategy(strategyConfig);
        autoGenerator.execute();
    }
}
